CSS in JS
スタイル記述方法の種類
テンプレートタグ
css\`font-family: sans-serif;\` みたいなやつ
CSSからの/へのコピペ容易性が高い
とはいえネストが必要だったりする
エディタサポートが別途必要
各種サービスのシンタックスハイライトが効かないがち
オブジェクトリテラル
{fontFamily: "sans-serif"} みたいなやつ
CSSと書きかたが違う
camelCase
疑似セレクタやメディアクエリですごい記法が要求されることも
JavaScriptネイティブ
1px solid #555 みたいなのにちゃんと型がついてるわけではないが……
変数とかで操作しやすい
静的解析する場合はできないかも……
CSS挿入タイミングでの分類
ランタイムあり
ブラウザでの実行時にJavaScriptを使ってCSSを挿入する
propsやstateに応じて自由にスタイルを操作できる
挿入処理が入ることでバンドルサイズが増加し、またそれを実行する計算コストがかかる
コンパイル時にJSソース中のスタイルを解析してCSSを生成する
パフォーマンスが改善されるはず
バンドラとの統合が必須になる (設定がさらにめんどくなる)
JSXのstyle属性にオブジェクトでスタイルを渡す。
code:tsx
const Inline = () => <p style={{ color: "red" }}></p>;
👍
プレーンなオブジェクトで書ける
TypeScriptで型による補完やチェックが機能する
スコープがめちゃくそ狭い
この要素にしか効果がない
「本当にここだけに必要なスタイル」には向く
👎
表現力が低い
宣言ブロックの中身しか書くことができない
メディアクエリが使えない
style をつけた要素しかスタイリングできない
グローバルスタイルが書けない
メンテナンス性が低い
JSのオブジェクト記法で書く必要があり、CSSからの移植に手間がかかる
CSSを書く必要がある
文法が異なるとはいえセマンティクスはCSS
<style jsx></style> の中にテンプレートリテラルでスタイルを書く。
code:tsx
const Styledjsx = () => {
return (
<div>
<p>styled-jsx</p>
<style jsx>
{`
p {
color: red;
}
@media (max-width: 600px) {
p:after {
content: "メディアクエリも使える!";
margin-inline-start: 1rem;
}
}
`}
</style>
<style global jsx>
{`
body {
font-family: serif;
}
`}
</style>
</div>
);
};
👍
表現力が十分にある
メディアクエリ書ける
スコープされる
コンポーネントの各要素は jsx-3386868590 のようなクラスをもつ
テンプレートリテラルなのでCSSがそのまま書ける
直感的
HTMLに<style></style>を使ってCSSを書くのとめちゃくちゃ似てる
👎
テンプレートリテラル
別途拡張を入れないとシンタックスハイライトすら効かない
型チェックが効かない